#!/usr/bin/perl
use strict;
use warnings;
use autodie;

# 首先，这个数据分为3个大类
# 1.文件的映射
# 2.一些特殊区域的映射 堆栈之类
# 3.未知区域的映射

# 每个区域的一些数据
# 1.虚拟内存段开始结束地址
# 2.内存段权限及其共享状态
# 3.文件的主设备号和次设备号
# 4.该虚拟内存段在对应的映射文件中的偏移量
# 5.被映射到虚拟内存的文件的索引节点号
# 6.被映射到虚拟内存的文件名称
# 7.Size 进程使用的内存空间
# 8.Rss
# 9.Pss
# 10.Shared_Clean和其他进程共享的未改写页面；
# 11.Shared_Dirty
# 12.Private_Clean
# 13.Private_Dirty
# 14.Referenced
# 15.Anonymous
# 16.AnonHugePage
# 17.Swap
# 18.KernelPageSize
# 19.MMUPageSize
#最后应该是打印出这个进程总的一些情况，
#然后是对比出一些在增长状态的区域的情况。可以做成定时任务。
#每次执行数据分析的时间作为key来存储各个hash数值
my @smaps_time_record_list;
#http://samuelsarla.blog.hexun.com/12804099_d.html
#http://www.linuxquestions.org/linux/articles/Technical/Understanding_memory_usage_on_Linux
#http://challengezcy.blog.163.com/blog/static/692292722009112395221795/
#首先是对参数进行判断，传入参数要是进程的名字
if(@ARGV != 1) {
	print "usage: perl ",__FILE__," <prog name>\n";
	exit 1;
} else {
	#判断是否是一个已经在运行的进程
	my $cmd_line = "ps aux | grep '$ARGV[0]' | grep -v 'grep' | grep -v '".__FILE__."'";
	my $prog_info = `$cmd_line`;
	if($prog_info eq "") {
		print "not a running thread! maybe the program '$ARGV[0]' not run!\n";
		exit 1;
	}
}
#将smaps的打印的信息分为19条目，然后解析文本将数据分存到各个条目中
#执行命令然后获取到结果
my $cmd_line = "ps aux | grep '$ARGV[0]' | grep -v 'grep' | grep -v '".__FILE__."' | awk '{cmdl=\"cat /proc/\"\$2\"/smaps\";system(cmdl);}'";
my @cmd_exec_res_lines = `$cmd_line`;
my %smaps_mem_zone_info;
for(@cmd_exec_res_lines) {
	chomp($_);
	#print $_;
	my $rec_time = `date "+%Y%m%d-%H%M%S"`;
	if(m/^[\w|\d]{10}-[\w|\d]{10}/) {
		#print "$_\n";
		$smaps_mem_zone_info{"vm_start_to_vm_end"} = $_;
		push(@smaps_time_record_list,{%smaps_mem_zone_info});
		#rewrite
		#print $smaps_mem_zone_info{"vm_start_to_vm_end"},"\n";
	}
}

for(@smaps_time_record_list) {
	print $_{"vm_start_to_vm_end"},"\n";
	# my $rec_date_time = $_{"record_time"};
	# my $vm_info = $_{"vm_start_to_vm_end"};
	# print "rec time $rec_date_time vm $vm_info\n";
}